package org.posupe.distribuicao;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import org.posupe.areas.Area;
import org.posupe.areas.AreaInexistenteException;
import org.posupe.areas.AreaJaCadastradaException;
import org.posupe.areas.IteratorAreas;
import org.posupe.candidatos.Candidato;
import org.posupe.candidatos.CandidatoInexistenteException;
import org.posupe.candidatos.CandidatoJaCadastradoException;
import org.posupe.candidatos.IteratorCandidatos;
import org.posupe.curriculos.Curriculo;
import org.posupe.curriculos.CurriculoInexistenteException;
import org.posupe.curriculos.CurriculoJaCadastradoException;
import org.posupe.curriculos.IteratorCurriculos;
import org.posupe.cursos.Curso;
import org.posupe.cursos.CursoInexistenteException;
import org.posupe.cursos.CursoJaCadastradoException;
import org.posupe.cursos.IteratorCursos;
import org.posupe.empresas.CnpjInvalidoException;
import org.posupe.empresas.Empresa;
import org.posupe.empresas.EmpresaInexistenteException;
import org.posupe.empresas.EmpresaJaCadastradaException;
import org.posupe.empresas.IteratorEmpresas;
import org.posupe.experiencias.Experiencia;
import org.posupe.experiencias.ExperienciaInexistenteException;
import org.posupe.experiencias.ExperienciaJaCadastradaException;
import org.posupe.experiencias.IteratorExperiencias;
import org.posupe.fachada.IFachadaCVAdmin;
import org.posupe.instituicoesEnsino.InstituicaoEnsino;
import org.posupe.instituicoesEnsino.InstituicaoEnsinoInexistenteException;
import org.posupe.instituicoesEnsino.InstituicaoEnsinoJaCadastradaException;
import org.posupe.instituicoesEnsino.IteratorInstituicoesEnsino;
import org.posupe.util.RepositorioException;

public class RMISourceCVAdmin implements IFachadaCVAdmin {

	private static RMISourceCVAdmin instance;

	private IRMITargetCVAdmin target;

	public static RMISourceCVAdmin getInstance() throws ComunicacaoException {
		if (instance == null) {
			instance = new RMISourceCVAdmin();
		}
		return instance;
	}

	private RMISourceCVAdmin() throws ComunicacaoException {
		try {
			this.target = (IRMITargetCVAdmin) Naming.lookup("//"
					+ IRMITargetCVAdmin.HOST_NAME + ":"
					+ IRMITargetCVAdmin.PORT + "/"
					+ IRMITargetCVAdmin.SERVICE_NAME);
		} catch (MalformedURLException e) {
			throw new ComunicacaoException(e);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		} catch (NotBoundException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(Area area) throws RepositorioException,
			AreaInexistenteException, ComunicacaoException {
		try {
			this.target.atualizar(area);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(Candidato candidato) throws RepositorioException,
			CandidatoInexistenteException, ComunicacaoException {
		try {
			this.target.atualizar(candidato);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(Curriculo curriculo)
			throws CurriculoInexistenteException, RepositorioException,
			AreaInexistenteException, CursoInexistenteException,
			ExperienciaInexistenteException, CandidatoInexistenteException,
			ComunicacaoException {
		try {
			this.target.atualizar(curriculo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(Curso curso) throws CursoInexistenteException,
			InstituicaoEnsinoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			this.target.atualizar(curso);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(Empresa empresa) throws EmpresaInexistenteException,
			RepositorioException, ComunicacaoException {
		try {
			this.target.atualizar(empresa);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(Experiencia experiencia) throws RepositorioException,
			ExperienciaInexistenteException, EmpresaInexistenteException,
			ComunicacaoException {
		try {
			this.target.atualizar(experiencia);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void atualizar(InstituicaoEnsino instituicaoEnsino)
			throws InstituicaoEnsinoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			this.target.atualizar(instituicaoEnsino);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(Area area) throws RepositorioException,
			AreaJaCadastradaException, ComunicacaoException {
		try {
			this.target.cadastrar(area);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(Candidato candidato) throws RepositorioException,
			CandidatoJaCadastradoException, ComunicacaoException {
		try {
			this.target.cadastrar(candidato);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(Curriculo curriculo)
			throws CurriculoJaCadastradoException, RepositorioException,
			AreaInexistenteException, CursoInexistenteException,
			ExperienciaInexistenteException, CandidatoInexistenteException,
			ComunicacaoException {
		try {
			this.target.cadastrar(curriculo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(Curso curso) throws CursoJaCadastradoException,
			InstituicaoEnsinoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			this.target.cadastrar(curso);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(Empresa empresa) throws EmpresaJaCadastradaException,
			RepositorioException, CnpjInvalidoException, ComunicacaoException {
		try {
			this.target.cadastrar(empresa);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(Experiencia experiencia) throws RepositorioException,
			ExperienciaJaCadastradaException, ExperienciaInexistenteException,
			ComunicacaoException {
		try {
			this.target.cadastrar(experiencia);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void cadastrar(InstituicaoEnsino instituicaoEnsino)
			throws InstituicaoEnsinoJaCadastradaException,
			RepositorioException, ComunicacaoException {
		try {
			this.target.cadastrar(instituicaoEnsino);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeArea(int codigo) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.existeArea(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeCandidato(String cpf) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.existeCandidato(cpf);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeCurriculo(int codigo) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.existeCurriculo(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeCurso(int codigo) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.existeCurso(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeEmpresa(String cnpj) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.existeEmpresa(cnpj);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeExperiencia(int codigo)
			throws ExperienciaInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			return this.target.existeExperiencia(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public boolean existeInstituicaoEnsino(String codigo)
			throws RepositorioException, ComunicacaoException {
		try {
			return this.target.existeInstituicaoEnsino(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorAreas getAreas() throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.getAreas();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorCandidatos getCandidatos() throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.getCandidatos();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorCurriculos getCurriculos() throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.getCurriculos();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorCursos getCursos() throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.getCursos();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorEmpresas getEmpresas() throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.getEmpresas();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorExperiencias getExperiencias() throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.getExperiencias();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorInstituicoesEnsino getInstituicoesEnsino()
			throws RepositorioException, ComunicacaoException {
		try {
			return this.target.getInstituicoesEnsino();
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorAreas procurar(Area area) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurar(area);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorCandidatos procurar(Candidato candidato)
			throws RepositorioException, ComunicacaoException {
		try {
			return this.target.procurar(candidato);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorCurriculos procurar(Curriculo curriculo)
			throws RepositorioException, ComunicacaoException {
		try {
			return this.target.procurar(curriculo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorCursos procurar(Curso curso) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurar(curso);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorEmpresas procurar(Empresa empresa)
			throws RepositorioException, ComunicacaoException {
		try {
			return this.target.procurar(empresa);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorExperiencias procurar(Experiencia experiencia)
			throws RepositorioException, ComunicacaoException {
		try {
			return this.target.procurar(experiencia);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public IteratorInstituicoesEnsino procurar(
			InstituicaoEnsino instituicaoEnsino) throws RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurar(instituicaoEnsino);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public Area procurarArea(int codigo) throws RepositorioException,
			AreaInexistenteException, ComunicacaoException {
		try {
			return this.target.procurarArea(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public Candidato procurarCandidato(String cpf) throws RepositorioException,
			CandidatoInexistenteException, ComunicacaoException {
		try {
			return this.target.procurarCandidato(cpf);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public Curriculo procurarCurriculo(int codigo)
			throws CurriculoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurarCurriculo(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public Curso procurarCurso(int codigo) throws CursoInexistenteException,
			RepositorioException, ComunicacaoException {
		try {
			return this.target.procurarCurso(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public Empresa procurarEmpresa(String cnpj)
			throws EmpresaInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurarEmpresa(cnpj);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public Experiencia procurarExperiencia(int codigo)
			throws ExperienciaInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurarExperiencia(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public InstituicaoEnsino procurarInstituicaoEnsino(String codigo)
			throws InstituicaoEnsinoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			return this.target.procurarInstituicaoEnsino(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerArea(int codigo) throws RepositorioException,
			AreaInexistenteException, ComunicacaoException {
		try {
			this.target.removerArea(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerCandidato(String cpf) throws RepositorioException,
			CandidatoInexistenteException, ComunicacaoException {
		try {
			this.target.removerCandidato(cpf);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerCurriculo(int codigo)
			throws CurriculoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			this.target.removerCurriculo(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerCurso(int codigo) throws CursoInexistenteException,
			RepositorioException, ComunicacaoException {
		try {
			this.target.removerCurso(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerEmpresa(String cnpj) throws EmpresaInexistenteException,
			RepositorioException, ComunicacaoException {
		try {
			this.target.removerEmpresa(cnpj);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerExperiencia(int codigo)
			throws ExperienciaInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			this.target.removerExperiencia(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

	public void removerInstituicaoEnsino(String codigo)
			throws InstituicaoEnsinoInexistenteException, RepositorioException,
			ComunicacaoException {
		try {
			this.target.removerInstituicaoEnsino(codigo);
		} catch (RemoteException e) {
			throw new ComunicacaoException(e);
		}
	}

}
